package net.zjitc.tree;

public class MyBinaryTree<E> implements BinaryTree<E>  {

    private TreeNode<E> root;

    //构造
    public MyBinaryTree(TreeNode<E> root) {
        this.root = root;
    }


    public TreeNode<E> getRoot() {
        return root;
    }

    public void setRoot(TreeNode<E> root) {
        this.root = root;
    }

    /**
     * 获得左子树
     *
     * @param p
     * @return
     */
    @Override
    public TreeNode<E> getLChild(TreeNode<E> p) {
        return p.left;
    }

    /**
     * 获得右子树
     *
     * @param p
     * @return
     */
    @Override
    public TreeNode<E> getRChild(TreeNode<E> p) {
        return p.rigth;
    }

    /**
     * 插入节点到左子树
     *
     * @param var
     * @param p
     */
    @Override
    public void insertL(E var, TreeNode<E> p) {
      if (p.left != null){
          throw new RuntimeException("左子树已经存在");
      }
      TreeNode<E> node = new TreeNode<>(var);
      p.left = node;
    }

    /**
     * 插入节点到右子树
     *
     * @param var
     * @param p
     */
    @Override
    public void insertR(E var, TreeNode<E> p) {
        if (p.rigth != null){
            throw new RuntimeException("左子树已经存在");
        }
        TreeNode<E> node = new TreeNode<>(var);
        p.rigth = node;
    }

    /**
     * 删除p的左子树
     *
     * @param p
     */
    @Override
    public void deleteL(TreeNode<E> p) {

    }

    /**
     * 删除p的右子树
     *
     * @param p
     */
    @Override
    public void deleteR(TreeNode<E> p) {

    }

    /**
     * 查找元素节点
     *
     * @param root
     * @param var
     * @return
     */
    @Override
    public TreeNode<E> search(TreeNode<E> root, E var) {
        return null;
    }

    /**
     * 遍历二叉树
     *
     * @param i    遍历的方式： 1：前序 2：中序 3：后序
     */
    @Override
    public void traverse(int i) {
      switch (i){
          case 1: preOrder(root);
          break;
          case 2:
              break;
      }
    }


    /**
     * 前序遍历
     * @param node
     */
    private void preOrder(TreeNode<E> node){
        if (node != null){
            //根
            System.out.println(node.data);
            //左
            preOrder(node.left);
            //右
            preOrder(node.rigth);
        }
    }

    /**
     * 中序遍历
     * @param node
     */
    private void inOrder(TreeNode<E> node){

    }

    /**
     * 后序遍历
     * @param node
     */
    private void postOrder(TreeNode<E> node){

    }

}
